package com.zhang.common.generator.mybatisplus;

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 自定义ID生成器
 *
 * 也可直接使用注解放在实体字段上 例如： @TableId(type = IdType.ASSIGN_ID)
 * ASSIGN_ID：  19位数字   支持类型：Long,Integer,String 支持自动转换为String类型，但数值类型不支持自动转换，需精准匹配，例如返回Long，实体主键就不支持定义为Integer
 * ASSIGN_UUID：32位字符串 支持类型：String              默认不含中划线的UUID生成
 *
 * ***要注解生效必须使用 BaseMapper 的 Insert方法
 *
 * @author zhangxin
 * @date 2021/7/8
 */
@Slf4j
@Component
public class CustomIdGenerator implements IdentifierGenerator {

    private final AtomicLong al = new AtomicLong(1);

    @Override
    public Long nextId(Object entity) {
        //可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
        String bizKey = entity.getClass().getName();
        MetaObject metaObject = SystemMetaObject.forObject(entity);
        String name = (String) metaObject.getValue("name");
        final long id = al.getAndAdd(1);
        log.info("为{}生成主键值->:{}", name, id);
        //返回生成的id值即可.
        return id;
    }
}
